<?php

require_once __DIR__ . '/../vendor/autoload.php';

use JLPay\Core\OrgConfig;
use JLPay\Core\DemoConfig;
use JLPay\Services\FileService;
use JLPay\Models\Upload\ImageUploadRequest;
use JLPay\Models\Upload\VideoUploadRequest;
use JLPay\Models\Upload\PdfUploadRequest;
use JLPay\Models\Upload\FileUploadResponse;
use JLPay\Utils\Logger;

/**
 * 商户文件上传相关接口调用示例
 */

// =================== 常量定义 =====================
// 文件类型常量
const FILE_TYPE_IMAGE = "image";
const FILE_TYPE_VIDEO = "video";
const FILE_TYPE_PDF = "pdf";

// 调试模式开关（设置为true可查看详细的请求和响应信息）
const DEBUG_MODE = false;

// =================== 工具函数 =====================
/**
 * 创建配置对象
 */
function createConfig(): OrgConfig
{
    return DemoConfig::createUploadConfig();
}

/**
 * 发送请求并处理响应
 */
function sendRequestAndHandleResponse(FileService $service, object $request, string $operationName): ?string
{
    $logger = Logger::getInstance();
    
    try {
        // 根据请求类型调用不同的服务方法
        if ($request instanceof ImageUploadRequest) {
            $response = $service->uploadImage($request);
        } elseif ($request instanceof VideoUploadRequest) {
            $response = $service->uploadVideo($request);
        } elseif ($request instanceof PdfUploadRequest) {
            $response = $service->uploadPdf($request);
        } else {
            $logger->error("不支持的请求类型: " . get_class($request));
            return null;
        }
        
        if ($response->isSuccess()) {
            $logger->info("{$operationName}成功！");
            if ($response->getMediaId()) {
                $logger->info("媒体文件ID: " . $response->getMediaId());
            }
            return $response->getMediaId();
        } else {
            $logger->error("{$operationName}失败: {$response->getRetCode()} - {$response->getRetMsg()}");
            return null;
        }
    } catch (Exception $e) {
        $errorMessage = $e->getMessage();
        $logger->error("请求异常: " . $errorMessage);
        
        // 对常见错误提供友好提示
        if (strpos($errorMessage, '404') !== false) {
            $logger->info("提示：404错误通常表示API路径不正确，请检查：");
            $logger->info("  1. 上传域名是否正确");
            $logger->info("  2. API路径是否与实际接口文档一致");
            $logger->info("  3. 是否有权限访问该接口");
        } elseif (strpos($errorMessage, '401') !== false || strpos($errorMessage, '403') !== false) {
            $logger->info("提示：认证失败，请检查：");
            $logger->info("  1. App ID是否正确");
            $logger->info("  2. 私钥和公钥是否匹配");
            $logger->info("  3. 签名算法是否正确");
        } elseif (strpos($errorMessage, 'CURL') !== false) {
            $logger->info("提示：网络连接失败，请检查：");
            $logger->info("  1. 网络连接是否正常");
            $logger->info("  2. 域名是否可访问");
            $logger->info("  3. 防火墙设置");
        }
        
        return null;
    }
}

// =================== 示例函数 =====================
/**
 * 图片上传示例
 */
function imageUploadDemo(string $imagePath): ?string
{
    $logger = Logger::getInstance();
    $logger->info("开始执行图片上传示例");
    
    // 创建配置对象和文件服务
    $config = createConfig();
    $fileService = new FileService($config);
    
    // 创建图片上传请求
    $request = new ImageUploadRequest();
    $request->setFileFromPath($imagePath);
    
    // 设置完整的meta信息（包含filename、alg、abstract）
    $request->setMetaWithDigest(basename($imagePath));
    
    // 发送请求
    $mediaId = sendRequestAndHandleResponse($fileService, $request, "图片上传");
    
    $logger->info("图片上传示例执行完毕");
    return $mediaId;
}

/**
 * 视频上传示例
 */
function videoUploadDemo(string $videoPath): ?string
{
    $logger = Logger::getInstance();
    $logger->info("开始执行视频上传示例");
    
    // 创建配置对象和文件服务
    $config = createConfig();
    $fileService = new FileService($config);
    
    // 创建视频上传请求
    $request = new VideoUploadRequest();
    $request->setFileFromPath($videoPath);
    
    // 设置完整的meta信息（包含filename、alg、abstract）
    $request->setMetaWithDigest(basename($videoPath));
    
    // 发送请求
    $mediaId = sendRequestAndHandleResponse($fileService, $request, "视频上传");
    
    $logger->info("视频上传示例执行完毕");
    return $mediaId;
}

/**
 * PDF上传示例
 */
function pdfUploadDemo(string $pdfPath): ?string
{
    $logger = Logger::getInstance();
    $logger->info("开始执行PDF上传示例");
    
    // 创建配置对象和文件服务
    $config = createConfig();
    $fileService = new FileService($config);
    
    // 创建PDF上传请求
    $request = new PdfUploadRequest();
    $request->setFileFromPath($pdfPath);
    
    // 设置完整的meta信息（包含filename、alg、abstract）
    $request->setMetaWithDigest(basename($pdfPath));
    
    // 发送请求
    $mediaId = sendRequestAndHandleResponse($fileService, $request, "PDF上传");
    
    $logger->info("PDF上传示例执行完毕");
    return $mediaId;
}

/**
 * 从URL或Base64上传图片示例
 */
function imageUploadFromContentDemo(): ?string
{
    $logger = Logger::getInstance();
    $logger->info("开始执行从内容上传图片示例");
    
    // 创建配置对象和文件服务
    $config = createConfig();
    $fileService = new FileService($config);
    
    // 创建一个简单的PNG图片（1x1像素的红色图片）
    $imageContent = base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==');
    
    // 创建图片上传请求
    $request = new ImageUploadRequest();
    $request->setFile($imageContent, 'test_image.png');
    
    // 设置完整的meta信息（包含filename、alg、abstract）
    $request->setMetaWithDigest('test_image.png', $imageContent);
    
    // 发送请求
    $mediaId = sendRequestAndHandleResponse($fileService, $request, "从内容上传图片");
    
    $logger->info("从内容上传图片示例执行完毕");
    return $mediaId;
}

// =================== 创建示例文件 =====================
/**
 * 创建示例文件
 */
function createSampleFiles(): array
{
    $sampleDir = __DIR__ . '/sample_files';
    if (!is_dir($sampleDir)) {
        mkdir($sampleDir, 0755, true);
    }
    
    $files = [];
    
    // 创建示例图片文件（1x1像素的PNG图片）
    $imagePath = $sampleDir . '/test_image.png';
    if (!file_exists($imagePath)) {
        $imageContent = base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==');
        file_put_contents($imagePath, $imageContent);
        $files[] = $imagePath;
    }
    
    // 创建示例PDF文件（最小的PDF）
    $pdfPath = $sampleDir . '/test_document.pdf';
    if (!file_exists($pdfPath)) {
        $pdfContent = "%PDF-1.4\n1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj\n2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj\n3 0 obj<</Type/Page/Parent 2 0 R/MediaBox[0 0 612 792]>>endobj\nxref\n0 4\n0000000000 65535 f \n0000000009 00000 n \n0000000058 00000 n \n0000000115 00000 n \ntrailer<</Size 4/Root 1 0 R>>\nstartxref\n174\n%%EOF";
        file_put_contents($pdfPath, $pdfContent);
        $files[] = $pdfPath;
    }
    
    return $files;
}

// =================== 主程序 =====================
// 使用basename比较，避免路径问题
if (basename(__FILE__) === basename($_SERVER['SCRIPT_FILENAME'] ?? '')) {
    // 启用错误显示
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    $logger = Logger::getInstance();
    
    // 根据调试模式设置日志级别
    if (DEBUG_MODE) {
        $logger->setLevel('DEBUG');
        $logger->info("调试模式已开启，将显示详细的请求和响应信息");
    } else {
        $logger->setLevel('INFO');
    }
    
    // 配置说明
    $logger->info("====================================");
    $logger->info("文件上传示例程序");
    $logger->info("====================================");
    $logger->info("注意事项：");
    $logger->info("1. 请确保使用正确的上传域名（当前：https://upload-uat.jlpay.com）");
    $logger->info("   API路径：/base/file/upload/image, /base/file/upload/video, /base/file/upload/pdf");
    $logger->info("2. 请确保App ID和密钥配置正确");
    $logger->info("3. 示例中的密钥仅供测试，生产环境请使用实际密钥");
    $logger->info("4. 如遇404错误，请检查API路径是否正确");
    $logger->info("====================================");
    
    // 示例文件路径，根据实际情况替换
    $sampleImagePath = __DIR__ . '/sample_files/test_image.png';
    $sampleVideoPath = __DIR__ . '/sample_files/test_video.mp4';
    $samplePdfPath = __DIR__ . '/sample_files/test_document.pdf';
    
    // 创建示例文件
    try {
        $createdFiles = createSampleFiles();
        if (!empty($createdFiles)) {
            $logger->info("创建了示例文件: " . implode(', ', $createdFiles));
        }
    } catch (Exception $e) {
        $logger->error("创建示例文件失败: " . $e->getMessage());
        exit(1);
    }
    
    $logger->info(str_repeat("=", 50));
    $logger->info("===== 商户文件上传示例 开始 =====");
    $logger->info(str_repeat("=", 50));
    
    // 检查文件是否存在，执行对应的示例
    if (file_exists($sampleImagePath)) {
        $logger->info("\n" . str_repeat("=", 50));
        $logger->info("===== 图片上传示例 开始 =====");
        $logger->info(str_repeat("=", 50));
        imageUploadDemo($sampleImagePath);
    } else {
        $logger->warning("图片文件不存在: {$sampleImagePath}");
    }
    
    if (file_exists($sampleVideoPath)) {
        $logger->info("\n" . str_repeat("=", 50));
        $logger->info("===== 视频上传示例 开始 =====");
        $logger->info(str_repeat("=", 50));
        videoUploadDemo($sampleVideoPath);
    } else {
        $logger->warning("视频文件不存在: {$sampleVideoPath}");
    }
    
    if (file_exists($samplePdfPath)) {
        $logger->info("\n" . str_repeat("=", 50));
        $logger->info("===== PDF上传示例 开始 =====");
        $logger->info(str_repeat("=", 50));
        pdfUploadDemo($samplePdfPath);
    } else {
        $logger->warning("PDF文件不存在: {$samplePdfPath}");
    }
    
    // 从内容上传示例
    $logger->info("\n" . str_repeat("=", 50));
    $logger->info("===== 从内容上传图片示例 开始 =====");
    $logger->info(str_repeat("=", 50));
    imageUploadFromContentDemo();
    
    $logger->info("\n" . str_repeat("=", 50));
    $logger->info("===== 所有示例执行完毕 =====");
    $logger->info(str_repeat("=", 50));
} 